home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / tmnt.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  18KB  |  665 lines

  1. #include "driver.h"
  2. #include "vidhrdw/konamiic.h"
  3.  
  4.  
  5. static int layer_colorbase[3],sprite_colorbase,bg_colorbase;
  6. static int priorityflag;
  7. static int layerpri[3];
  8.  
  9.  
  10.  
  11. /***************************************************************************
  12.  
  13.   Callbacks for the K052109
  14.  
  15. ***************************************************************************/
  16.  
  17. /* Missing in Action */
  18.  
  19. static void mia_tile_callback(int layer,int bank,int *code,int *color)
  20. {
  21.     tile_info.flags = (*color & 0x04) ? TILE_FLIPX : 0;
  22.     if (layer == 0)
  23.     {
  24.         *code |= ((*color & 0x01) << 8);
  25.         *color = layer_colorbase[layer] + ((*color & 0x80) >> 5) + ((*color & 0x10) >> 1);
  26.     }
  27.     else
  28.     {
  29.         *code |= ((*color & 0x01) << 8) | ((*color & 0x18) << 6) | (bank << 11);
  30.         *color = layer_colorbase[layer] + ((*color & 0xe0) >> 5);
  31.     }
  32. }
  33.  
  34. static void tmnt_tile_callback(int layer,int bank,int *code,int *color)
  35. {
  36.     *code |= ((*color & 0x03) << 8) | ((*color & 0x10) << 6) | ((*color & 0x0c) << 9)
  37.             | (bank << 13);
  38.     *color = layer_colorbase[layer] + ((*color & 0xe0) >> 5);
  39. }
  40.  
  41. static int detatwin_rombank;
  42.  
  43. static void detatwin_tile_callback(int layer,int bank,int *code,int *color)
  44. {
  45.     /* (color & 0x02) is flip y handled internally by the 052109 */
  46.     *code |= ((*color & 0x01) << 8) | ((*color & 0x10) << 5) | ((*color & 0x0c) << 8)
  47.             | (bank << 12) | detatwin_rombank << 14;
  48.     *color = layer_colorbase[layer] + ((*color & 0xe0) >> 5);
  49. }
  50.  
  51.  
  52.  
  53. /***************************************************************************
  54.  
  55.   Callbacks for the K051960
  56.  
  57. ***************************************************************************/
  58.  
  59. static void mia_sprite_callback(int *code,int *color,int *priority)
  60. {
  61.     *color = sprite_colorbase + (*color & 0x0f);
  62. }
  63.  
  64. static void tmnt_sprite_callback(int *code,int *color,int *priority)
  65. {
  66.     *code |= (*color & 0x10) << 9;
  67.     *color = sprite_colorbase + (*color & 0x0f);
  68. }
  69.  
  70. static void punkshot_sprite_callback(int *code,int *color,int *priority_mask)
  71. {
  72.     int pri = 0x20 | ((*color & 0x60) >> 2);
  73.     if (pri <= layerpri[2])                                *priority_mask = 0;
  74.     else if (pri > layerpri[2] && pri <= layerpri[1])    *priority_mask = 0xf0;
  75.     else if (pri > layerpri[1] && pri <= layerpri[0])    *priority_mask = 0xf0|0xcc;
  76.     else                                                 *priority_mask = 0xf0|0xcc|0xaa;
  77.  
  78.     *code |= (*color & 0x10) << 9;
  79.     *color = sprite_colorbase + (*color & 0x0f);
  80. }
  81.  
  82. static void thndrx2_sprite_callback(int *code,int *color,int *priority_mask)
  83. {
  84.     int pri = 0x20 | ((*color & 0x60) >> 2);
  85.     if (pri <= layerpri[2])                                *priority_mask = 0;
  86.     else if (pri > layerpri[2] && pri <= layerpri[1])    *priority_mask = 0xf0;
  87.     else if (pri > layerpri[1] && pri <= layerpri[0])    *priority_mask = 0xf0|0xcc;
  88.     else                                                 *priority_mask = 0xf0|0xcc|0xaa;
  89.  
  90.     *color = sprite_colorbase + (*color & 0x0f);
  91. }
  92.  
  93.  
  94. /***************************************************************************
  95.  
  96.   Callbacks for the K053245
  97.  
  98. ***************************************************************************/
  99.  
  100. static void lgtnfght_sprite_callback(int *code,int *color,int *priority_mask)
  101. {
  102.     int pri = 0x20 | ((*color & 0x60) >> 2);
  103.     if (pri <= layerpri[2])                                *priority_mask = 0;
  104.     else if (pri > layerpri[2] && pri <= layerpri[1])    *priority_mask = 0xf0;
  105.     else if (pri > layerpri[1] && pri <= layerpri[0])    *priority_mask = 0xf0|0xcc;
  106.     else                                                 *priority_mask = 0xf0|0xcc|0xaa;
  107.  
  108.     *color = sprite_colorbase + (*color & 0x1f);
  109. }
  110.  
  111. static void detatwin_sprite_callback(int *code,int *color,int *priority_mask)
  112. {
  113. #if 0
  114. if (keyboard_pressed(KEYCODE_Q) && (*color & 0x20)) *color = rand();
  115. if (keyboard_pressed(KEYCODE_W) && (*color & 0x40)) *color = rand();
  116. if (keyboard_pressed(KEYCODE_E) && (*color & 0x80)) *color = rand();
  117. #endif
  118.     int pri = 0x20 | ((*color & 0x60) >> 2);
  119.     if (pri <= layerpri[2])                                *priority_mask = 0;
  120.     else if (pri > layerpri[2] && pri <= layerpri[1])    *priority_mask = 0xf0;
  121.     else if (pri > layerpri[1] && pri <= layerpri[0])    *priority_mask = 0xf0|0xcc;
  122.     else                                                 *priority_mask = 0xf0|0xcc|0xaa;
  123.  
  124.     *color = sprite_colorbase + (*color & 0x1f);
  125. }
  126.  
  127.  
  128.  
  129. /***************************************************************************
  130.  
  131.   Start the video hardware emulation.
  132.  
  133. ***************************************************************************/
  134.  
  135. int mia_vh_start(void)
  136. {
  137.     layer_colorbase[0] = 0;
  138.     layer_colorbase[1] = 32;
  139.     layer_colorbase[2] = 40;
  140.     sprite_colorbase = 16;
  141.     if (K052109_vh_start(REGION_GFX1,NORMAL_PLANE_ORDER,mia_tile_callback))
  142.         return 1;
  143.     if (K051960_vh_start(REGION_GFX2,REVERSE_PLANE_ORDER,mia_sprite_callback))
  144.     {
  145.         K052109_vh_stop();
  146.         return 1;
  147.     }
  148.     return 0;
  149. }
  150.  
  151. int tmnt_vh_start(void)
  152. {
  153.     layer_colorbase[0] = 0;
  154.     layer_colorbase[1] = 32;
  155.     layer_colorbase[2] = 40;
  156.     sprite_colorbase = 16;
  157.     if (K052109_vh_start(REGION_GFX1,NORMAL_PLANE_ORDER,tmnt_tile_callback))
  158.         return 1;
  159.     if (K051960_vh_start(REGION_GFX2,REVERSE_PLANE_ORDER,tmnt_sprite_callback))
  160.     {
  161.         K052109_vh_stop();
  162.         return 1;
  163.     }
  164.     return 0;
  165. }
  166.  
  167. int punkshot_vh_start(void)
  168. {
  169.     if (K052109_vh_start(REGION_GFX1,NORMAL_PLANE_ORDER,tmnt_tile_callback))
  170.         return 1;
  171.     if (K051960_vh_start(REGION_GFX2,NORMAL_PLANE_ORDER,punkshot_sprite_callback))
  172.     {
  173.         K052109_vh_stop();
  174.         return 1;
  175.     }
  176.     return 0;
  177. }
  178.  
  179. int lgtnfght_vh_start(void)    /* also tmnt2, ssriders */
  180. {
  181.     if (K052109_vh_start(REGION_GFX1,NORMAL_PLANE_ORDER,tmnt_tile_callback))
  182.         return 1;
  183.     if (K053245_vh_start(REGION_GFX2,NORMAL_PLANE_ORDER,lgtnfght_sprite_callback))
  184.     {
  185.         K052109_vh_stop();
  186.         return 1;
  187.     }
  188.     return 0;
  189. }
  190.  
  191. int detatwin_vh_start(void)
  192. {
  193.     if (K052109_vh_start(REGION_GFX1,NORMAL_PLANE_ORDER,detatwin_tile_callback))
  194.         return 1;
  195.     if (K053245_vh_start(REGION_GFX2,NORMAL_PLANE_ORDER,detatwin_sprite_callback))
  196.     {
  197.         K052109_vh_stop();
  198.         return 1;
  199.     }
  200.     return 0;
  201. }
  202.  
  203. int glfgreat_vh_start(void)
  204. {
  205.     if (K052109_vh_start(REGION_GFX1,NORMAL_PLANE_ORDER,tmnt_tile_callback))
  206.         return 1;
  207.     if (K053245_vh_start(REGION_GFX2,NORMAL_PLANE_ORDER,lgtnfght_sprite_callback))
  208.     {
  209.         K052109_vh_stop();
  210.         return 1;
  211.     }
  212.     return 0;
  213. }
  214.  
  215. int thndrx2_vh_start(void)
  216. {
  217.     if (K052109_vh_start(REGION_GFX1,NORMAL_PLANE_ORDER,tmnt_tile_callback))
  218.         return 1;
  219.     if (K051960_vh_start(REGION_GFX2,NORMAL_PLANE_ORDER,thndrx2_sprite_callback))
  220.     {
  221.         K052109_vh_stop();
  222.         return 1;
  223.     }
  224.     return 0;
  225. }
  226.  
  227. void punkshot_vh_stop(void)
  228. {
  229.     K052109_vh_stop();
  230.     K051960_vh_stop();
  231. }
  232.  
  233. void lgtnfght_vh_stop(void)
  234. {
  235.     K052109_vh_stop();
  236.     K053245_vh_stop();
  237. }
  238.  
  239. void detatwin_vh_stop(void)
  240. {
  241.     K052109_vh_stop();
  242.     K053245_vh_stop();
  243. }
  244.  
  245. void glfgreat_vh_stop(void)
  246. {
  247.     K052109_vh_stop();
  248.     K053245_vh_stop();
  249. }
  250.  
  251. void thndrx2_vh_stop(void)
  252. {
  253.     K052109_vh_stop();
  254.     K051960_vh_stop();
  255. }
  256.  
  257.  
  258.  
  259. /***************************************************************************
  260.  
  261.   Memory handlers
  262.  
  263. ***************************************************************************/
  264.  
  265. WRITE_HANDLER( tmnt_paletteram_w )
  266. {
  267.     int oldword = READ_WORD(&paletteram[offset]);
  268.     int newword = COMBINE_WORD(oldword,data);
  269.     WRITE_WORD(&paletteram[offset],newword);
  270.  
  271.     offset /= 4;
  272.     {
  273.         int palette = ((READ_WORD(&paletteram[offset * 4]) & 0x00ff) << 8)
  274.                 + (READ_WORD(&paletteram[offset * 4 + 2]) & 0x00ff);
  275.         int r = palette & 31;
  276.         int g = (palette >> 5) & 31;
  277.         int b = (palette >> 10) & 31;
  278.  
  279.         r = (r << 3) + (r >> 2);
  280.         g = (g << 3) + (g >> 2);
  281.         b = (b << 3) + (b >> 2);
  282.  
  283.         palette_change_color (offset,r,g,b);
  284.     }
  285. }
  286.  
  287.  
  288.  
  289. WRITE_HANDLER( tmnt_0a0000_w )
  290. {
  291.     if ((data & 0x00ff0000) == 0)
  292.     {
  293.         static int last;
  294.  
  295.         /* bit 0/1 = coin counters */
  296.         coin_counter_w(0,data & 0x01);
  297.         coin_counter_w(1,data & 0x02);    /* 2 players version */
  298.  
  299.         /* bit 3 high then low triggers irq on sound CPU */
  300.         if (last == 0x08 && (data & 0x08) == 0)
  301.             cpu_cause_interrupt(1,0xff);
  302.  
  303.         last = data & 0x08;
  304.  
  305.         /* bit 5 = irq enable */
  306.         interrupt_enable_w(0,data & 0x20);
  307.  
  308.         /* bit 7 = enable char ROM reading through the video RAM */
  309.         K052109_set_RMRD_line((data & 0x80) ? ASSERT_LINE : CLEAR_LINE);
  310.  
  311.         /* other bits unused */
  312.     }
  313. }
  314.  
  315. WRITE_HANDLER( punkshot_0a0020_w )
  316. {
  317.     if ((data & 0x00ff0000) == 0)
  318.     {
  319.         static int last;
  320.  
  321.  
  322.         /* bit 0 = coin counter */
  323.         coin_counter_w(0,data & 0x01);
  324.  
  325.         /* bit 2 = trigger irq on sound CPU */
  326.         if (last == 0x04 && (data & 0x04) == 0)
  327.             cpu_cause_interrupt(1,0xff);
  328.  
  329.         last = data & 0x04;
  330.  
  331.         /* bit 3 = enable char ROM reading through the video RAM */
  332.         K052109_set_RMRD_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE);
  333.     }
  334. }
  335.  
  336. WRITE_HANDLER( lgtnfght_0a0018_w )
  337. {
  338.     if ((data & 0x00ff0000) == 0)
  339.     {
  340.         static int last;
  341.  
  342.  
  343.         /* bit 0,1 = coin counter */
  344.         coin_counter_w(0,data & 0x01);
  345.         coin_counter_w(1,data & 0x02);
  346.  
  347.         /* bit 2 = trigger irq on sound CPU */
  348.         if (last == 0x00 && (data & 0x04) == 0x04)
  349.             cpu_cause_interrupt(1,0xff);
  350.  
  351.         last = data & 0x04;
  352.  
  353.         /* bit 3 = enable char ROM reading through the video RAM */
  354.         K052109_set_RMRD_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE);
  355.     }
  356. }
  357.  
  358. WRITE_HANDLER( detatwin_700300_w )
  359. {
  360.     if ((data & 0x00ff0000) == 0)
  361.     {
  362.         /* bit 0,1 = coin counter */
  363.         coin_counter_w(0,data & 0x01);
  364.         coin_counter_w(1,data & 0x02);
  365.  
  366.         /* bit 3 = enable char ROM reading through the video RAM */
  367.         K052109_set_RMRD_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE);
  368.  
  369.         /* bit 7 = select char ROM bank */
  370.         if (detatwin_rombank != ((data & 0x80) >> 7))
  371.         {
  372.             detatwin_rombank = (data & 0x80) >> 7;
  373.             tilemap_mark_all_tiles_dirty(ALL_TILEMAPS);
  374.         }
  375.  
  376.         /* other bits unknown */
  377.     }
  378. }
  379.  
  380. WRITE_HANDLER( glfgreat_122000_w )
  381. {
  382.     if ((data & 0x00ff0000) == 0)
  383.     {
  384.         /* bit 0,1 = coin counter */
  385.         coin_counter_w(0,data & 0x01);
  386.         coin_counter_w(1,data & 0x02);
  387.  
  388.         /* bit 4 = enable char ROM reading through the video RAM */
  389.         K052109_set_RMRD_line((data & 0x10) ? ASSERT_LINE : CLEAR_LINE);
  390.  
  391.         /* other bits unknown */
  392.     }
  393. }
  394.  
  395. WRITE_HANDLER( ssriders_1c0300_w )
  396. {
  397.     if ((data & 0x00ff0000) == 0)
  398.     {
  399.         /* bit 0,1 = coin counter */
  400.         coin_counter_w(0,data & 0x01);
  401.         coin_counter_w(1,data & 0x02);
  402.  
  403.         /* bit 3 = enable char ROM reading through the video RAM */
  404.         K052109_set_RMRD_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE);
  405.  
  406.         /* other bits unknown (bits 4-6 used in TMNT2) */
  407.     }
  408. }
  409.  
  410.  
  411.  
  412. WRITE_HANDLER( tmnt_priority_w )
  413. {
  414.     if ((data & 0x00ff0000) == 0)
  415.     {
  416.         /* bit 2/3 = priority; other bits unused */
  417.         /* bit2 = PRI bit3 = PRI2
  418.               sprite/playfield priority is controlled by these two bits, by bit 3
  419.               of the background tile color code, and by the SHADOW sprite
  420.               attribute bit.
  421.               Priorities are encoded in a PROM (G19 for TMNT). However, in TMNT,
  422.               the PROM only takes into account the PRI and SHADOW bits.
  423.               PRI  Priority
  424.                0   bg fg spr text
  425.                1   bg spr fg text
  426.               The SHADOW bit, when set, torns a sprite into a shadow which makes
  427.               color below it darker (this is done by turning off three resistors
  428.               in parallel with the RGB output).
  429.  
  430.               Note: the background color (color used when all of the four layers
  431.               are 0) is taken from the *foreground* palette, not the background
  432.               one as would be more intuitive.
  433.         */
  434.         priorityflag = (data & 0x0c) >> 2;
  435.     }
  436. }
  437.  
  438.  
  439.  
  440. /***************************************************************************
  441.  
  442.   Display refresh
  443.  
  444. ***************************************************************************/
  445.  
  446. /* useful function to sort the three tile layers by priority order */
  447. static void sortlayers(int *layer,int *pri)
  448. {
  449. #define SWAP(a,b) \
  450.     if (pri[a] < pri[b]) \
  451.     { \
  452.         int t; \
  453.         t = pri[a]; pri[a] = pri[b]; pri[b] = t; \
  454.         t = layer[a]; layer[a] = layer[b]; layer[b] = t; \
  455.     }
  456.  
  457.     SWAP(0,1)
  458.     SWAP(0,2)
  459.     SWAP(1,2)
  460. }
  461.  
  462. void mia_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  463. {
  464.     K052109_tilemap_update();
  465.  
  466.     palette_init_used_colors();
  467.     K051960_mark_sprites_colors();
  468.     if (palette_recalc())
  469.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  470.  
  471.     tilemap_render(ALL_TILEMAPS);
  472.  
  473.     K052109_tilemap_draw(bitmap,2,TILEMAP_IGNORE_TRANSPARENCY);
  474.     if ((priorityflag & 1) == 1) K051960_sprites_draw(bitmap,0,0);
  475.     K052109_tilemap_draw(bitmap,1,0);
  476.     if ((priorityflag & 1) == 0) K051960_sprites_draw(bitmap,0,0);
  477.     K052109_tilemap_draw(bitmap,0,0);
  478. }
  479.  
  480. void tmnt_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  481. {
  482.     K052109_tilemap_update();
  483.  
  484.     palette_init_used_colors();
  485.     K051960_mark_sprites_colors();
  486.     if (palette_recalc())
  487.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  488.  
  489.     tilemap_render(ALL_TILEMAPS);
  490.  
  491.     K052109_tilemap_draw(bitmap,2,TILEMAP_IGNORE_TRANSPARENCY);
  492.     if ((priorityflag & 1) == 1) K051960_sprites_draw(bitmap,0,0);
  493.     K052109_tilemap_draw(bitmap,1,0);
  494.     if ((priorityflag & 1) == 0) K051960_sprites_draw(bitmap,0,0);
  495.     K052109_tilemap_draw(bitmap,0,0);
  496. }
  497.  
  498.  
  499. void punkshot_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  500. {
  501.     int layer[3];
  502.  
  503.  
  504.     bg_colorbase       = K053251_get_palette_index(K053251_CI0);
  505.     sprite_colorbase   = K053251_get_palette_index(K053251_CI1);
  506.     layer_colorbase[0] = K053251_get_palette_index(K053251_CI2);
  507.     layer_colorbase[1] = K053251_get_palette_index(K053251_CI4);
  508.     layer_colorbase[2] = K053251_get_palette_index(K053251_CI3);
  509.  
  510.     K052109_tilemap_update();
  511.  
  512.     palette_init_used_colors();
  513.     K051960_mark_sprites_colors();
  514.     if (palette_recalc())
  515.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  516.  
  517.     tilemap_render(ALL_TILEMAPS);
  518.  
  519.     layer[0] = 0;
  520.     layerpri[0] = K053251_get_priority(K053251_CI2);
  521.     layer[1] = 1;
  522.     layerpri[1] = K053251_get_priority(K053251_CI4);
  523.     layer[2] = 2;
  524.     layerpri[2] = K053251_get_priority(K053251_CI3);
  525.  
  526.     sortlayers(layer,layerpri);
  527.  
  528.     fillbitmap(priority_bitmap,0,NULL);
  529.     K052109_tilemap_draw(bitmap,layer[0],TILEMAP_IGNORE_TRANSPARENCY|(1<<16));
  530.     K052109_tilemap_draw(bitmap,layer[1],2<<16);
  531.     K052109_tilemap_draw(bitmap,layer[2],4<<16);
  532.  
  533.     K051960_sprites_draw(bitmap,-1,-1);
  534. }
  535.  
  536.  
  537. void lgtnfght_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  538. {
  539.     int layer[3];
  540.  
  541.  
  542.     bg_colorbase       = K053251_get_palette_index(K053251_CI0);
  543.     sprite_colorbase   = K053251_get_palette_index(K053251_CI1);
  544.     layer_colorbase[0] = K053251_get_palette_index(K053251_CI2);
  545.     layer_colorbase[1] = K053251_get_palette_index(K053251_CI4);
  546.     layer_colorbase[2] = K053251_get_palette_index(K053251_CI3);
  547.  
  548.     K052109_tilemap_update();
  549.  
  550.     palette_init_used_colors();
  551.     K053245_mark_sprites_colors();
  552.     palette_used_colors[16 * bg_colorbase] |= PALETTE_COLOR_VISIBLE;
  553.     if (palette_recalc())
  554.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  555.  
  556.     tilemap_render(ALL_TILEMAPS);
  557.  
  558.     layer[0] = 0;
  559.     layerpri[0] = K053251_get_priority(K053251_CI2);
  560.     layer[1] = 1;
  561.     layerpri[1] = K053251_get_priority(K053251_CI4);
  562.     layer[2] = 2;
  563.     layerpri[2] = K053251_get_priority(K053251_CI3);
  564.  
  565.     sortlayers(layer,layerpri);
  566.  
  567.     fillbitmap(priority_bitmap,0,NULL);
  568.     fillbitmap(bitmap,Machine->pens[16 * bg_colorbase],&Machine->drv->visible_area);
  569.     K052109_tilemap_draw(bitmap,layer[0],1<<16);
  570.     K052109_tilemap_draw(bitmap,layer[1],2<<16);
  571.     K052109_tilemap_draw(bitmap,layer[2],4<<16);
  572.  
  573.     K053245_sprites_draw(bitmap);
  574. }
  575.  
  576. void glfgreat_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  577. {
  578.     int layer[3];
  579.  
  580.  
  581.     bg_colorbase       = K053251_get_palette_index(K053251_CI0);
  582.     sprite_colorbase   = K053251_get_palette_index(K053251_CI1);
  583.     layer_colorbase[0] = K053251_get_palette_index(K053251_CI2);
  584.     layer_colorbase[1] = K053251_get_palette_index(K053251_CI3) + 8;    /* weird... */
  585.     layer_colorbase[2] = K053251_get_palette_index(K053251_CI4);
  586.  
  587.     K052109_tilemap_update();
  588.  
  589.     palette_init_used_colors();
  590.     K053245_mark_sprites_colors();
  591.     palette_used_colors[16 * bg_colorbase] |= PALETTE_COLOR_VISIBLE;
  592.     if (palette_recalc())
  593.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  594.  
  595.     tilemap_render(ALL_TILEMAPS);
  596.  
  597.     layer[0] = 0;
  598.     layerpri[0] = K053251_get_priority(K053251_CI2);
  599.     layer[1] = 1;
  600.     layerpri[1] = K053251_get_priority(K053251_CI3);
  601.     layer[2] = 2;
  602.     layerpri[2] = K053251_get_priority(K053251_CI4);
  603.  
  604.     sortlayers(layer,layerpri);
  605.  
  606.     fillbitmap(priority_bitmap,0,NULL);
  607.     fillbitmap(bitmap,Machine->pens[16 * bg_colorbase],&Machine->drv->visible_area);
  608.     K052109_tilemap_draw(bitmap,layer[0],1<<16);
  609.     K052109_tilemap_draw(bitmap,layer[1],2<<16);
  610.     K052109_tilemap_draw(bitmap,layer[2],4<<16);
  611.  
  612.     K053245_sprites_draw(bitmap);
  613. }
  614.  
  615. void ssriders_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  616. {
  617.     int i;
  618.  
  619.     for (i = 0;i < 128;i++)
  620.         if ((K053245_word_r(16*i) & 0x8000) && !(K053245_word_r(16*i+2) & 0x8000))
  621.             K053245_word_w(16*i,0xff000000|i);    /* workaround for protection */
  622.  
  623.     lgtnfght_vh_screenrefresh(bitmap,full_refresh);
  624. }
  625.  
  626.  
  627. void thndrx2_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  628. {
  629.     int layer[3];
  630.  
  631.  
  632.     bg_colorbase       = K053251_get_palette_index(K053251_CI0);
  633.     sprite_colorbase   = K053251_get_palette_index(K053251_CI1);
  634.     layer_colorbase[0] = K053251_get_palette_index(K053251_CI2);
  635.     layer_colorbase[1] = K053251_get_palette_index(K053251_CI4);
  636.     layer_colorbase[2] = K053251_get_palette_index(K053251_CI3);
  637.  
  638.     K052109_tilemap_update();
  639.  
  640.     palette_init_used_colors();
  641.     K051960_mark_sprites_colors();
  642.     palette_used_colors[16 * bg_colorbase] |= PALETTE_COLOR_VISIBLE;
  643.     if (palette_recalc())
  644.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  645.  
  646.     tilemap_render(ALL_TILEMAPS);
  647.  
  648.     layer[0] = 0;
  649.     layerpri[0] = K053251_get_priority(K053251_CI2);
  650.     layer[1] = 1;
  651.     layerpri[1] = K053251_get_priority(K053251_CI4);
  652.     layer[2] = 2;
  653.     layerpri[2] = K053251_get_priority(K053251_CI3);
  654.  
  655.     sortlayers(layer,layerpri);
  656.  
  657.     fillbitmap(priority_bitmap,0,NULL);
  658.     fillbitmap(bitmap,Machine->pens[16 * bg_colorbase],&Machine->drv->visible_area);
  659.     K052109_tilemap_draw(bitmap,layer[0],1<<16);
  660.     K052109_tilemap_draw(bitmap,layer[1],2<<16);
  661.     K052109_tilemap_draw(bitmap,layer[2],4<<16);
  662.  
  663.     K051960_sprites_draw(bitmap,-1,-1);
  664. }
  665.